package cn.org.seventh.web.aop;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;

import cn.org.seventh.web.annotation.View;

/**
 * AOP切入点定义类
 * 这里定义所有自定义AOP切入点
 * @author Seventh
 *
 */
@Aspect
public class PointcutDefinitions {

	/**
	 * 定义切面:
	 * 所有返回类型为ModelAndView的cn.org.seventh.web.controller包及子包中所有类的所有方法
	 */
	@Pointcut("execution( org.springframework.web.servlet.ModelAndView cn.org.seventh.web.controller..*.*(..) )")
	public void allContollerAndMethodPointcut() {
	};

	/**
	 * 定义切面:
	 * 需要有注释View出现
	 */
	@Pointcut("@annotation(view)")
	public void needsAnnotationViewPointcut(View view) {
	};

	/**
	 * 定义切面:
	 * 方法第一个参数类型必须匹配HttpServletRequest 
	 * 第二个参数类型必须匹配HttpServletResponse 
	 * 至少两个参数的方法
	 * 
	 * @param request
	 * @param response
	 */
	@Pointcut("args(request,response,..)")
	public void needsParameterRequestAndResponsePointcut(
			HttpServletRequest request, HttpServletResponse response) {
	};

	/**
	 * 组合切面:
	 * 所以返回类型为ModelAndView的cn.org.seventh.web.controller包及子包中所有类的所有方法
	 * 需要有注释View出现
	 * 方法第一个参数类型必须匹配HttpServletRequest 
	 * 第二个参数类型必须匹配HttpServletResponse 
	 * 至少两个参数的方法
	 * @param view
	 * @param request
	 * @param response
	 */
	@Pointcut("allContollerAndMethodPointcut()&&needsAnnotationViewPointcut(view)&&needsParameterRequestAndResponsePointcut(request,response)")
	public void viewSupportPointcut(View view, HttpServletRequest request,
			HttpServletResponse response) {
	};
}
